import 'package:flutter/material.dart';
import 'package:goods_sample/pages/state/state_empty_widget.dart';

import 'pages/goods/goods_detail.dart';

class RouterHelper {
  // 路由页面
  static const goodsDetail = 'detail';

  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch(settings.name) {
      case goodsDetail:
        return RightToLeftRouter(child: GoodsDetailWidget());
      default:
        return RightToLeftRouter(child: StateEmptyWidget());
    }
  }
}

//缩放路由动画
class ScaleRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  ScaleRouter({this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn}) : super(
    pageBuilder: (context, animation, secondaryAnimation) => child,
    transitionDuration: Duration(milliseconds: durationMs),
    transitionsBuilder: (context, a1, a2, child) => ScaleTransition(scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: a1, curve: curve)), child: child));
}
//渐变透明路由动画
class FadeRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  FadeRouter({this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn}) : super(
      pageBuilder: (context, animation, secondaryAnimation) => child,
      transitionDuration: Duration(milliseconds: durationMs),
      transitionsBuilder: (context, a1, a2, child) => FadeTransition(opacity: Tween(begin: 0.1, end: 1.0).animate(CurvedAnimation(parent: a1, curve:curve,)), child: child));
}

//旋转路由动画
class RotateRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  RotateRouter({this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn}) : super(
      pageBuilder: (context, animation, secondaryAnimation) => child,
      transitionDuration: Duration(milliseconds: durationMs),
      transitionsBuilder: (context, a1, a2, child) => RotationTransition(turns: Tween(begin: 0.1, end: 1.0).animate(CurvedAnimation(parent: a1, curve:curve,)), child: child,));
}

//右--->左
class RightToLeftRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  RightToLeftRouter({this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn}) :super(
      transitionDuration:Duration(milliseconds: durationMs),
      pageBuilder:(ctx,a1,a2)=>child,
      transitionsBuilder:(ctx,a1,a2, child,) => SlideTransition(child: child, position: Tween<Offset>(begin: Offset(1.0, 0.0), end: Offset(0.0, 0.0),).animate(CurvedAnimation(parent: a1, curve: curve))));
}

//左--->右
class LeftToRightRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  List<int> mapper;
  LeftToRightRouter({this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn}):assert(true),super(
      transitionDuration:Duration(milliseconds: durationMs),
      pageBuilder:(ctx,a1,a2){return child;},
      transitionsBuilder:(ctx,a1,a2,child,) => SlideTransition(position: Tween<Offset>(begin: Offset(-1.0, 0.0), end: Offset(0.0, 0.0),).animate(CurvedAnimation(parent: a1, curve: curve)), child:  child));
}

//上--->下
class TopToBottomRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  TopToBottomRouter({this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn}) :super(
      transitionDuration:Duration(milliseconds: durationMs),
      pageBuilder:(ctx,a1,a2){return child;},
      transitionsBuilder:(ctx,a1,a2, child,) => SlideTransition(position: Tween<Offset>(begin: Offset(0.0,-1.0), end: Offset(0.0, 0.0),).animate(CurvedAnimation(parent: a1, curve: curve)), child:  child));
}

//下--->上
class BottomToTopRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  BottomToTopRouter({this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn}) :super(
      transitionDuration:Duration(milliseconds: durationMs),
      pageBuilder:(ctx,a1,a2)=> child,
      transitionsBuilder:(ctx,a1,a2, child,) => SlideTransition(position: Tween<Offset>(begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0),).animate(CurvedAnimation(parent: a1, curve: curve)), child:  child));
}

//缩放+透明+旋转路由动画
class ScaleFadeRotateRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int durationMs;
  final Curve curve;
  ScaleFadeRotateRouter({this.child, this.durationMs = 1000,this.curve=Curves.fastOutSlowIn}) : super(
      transitionDuration: Duration(milliseconds: durationMs),
      pageBuilder: (ctx, a1, a2)=>child,//页面
      transitionsBuilder: (ctx, a1, a2, Widget child,) =>
          RotationTransition(//旋转动画
            turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: a1, curve: curve,)),
            child: ScaleTransition(//缩放动画
              scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: a1, curve: curve)),
              child: FadeTransition(opacity://透明度动画
              Tween(begin: 0.5, end: 1.0).animate(CurvedAnimation(parent: a1, curve: curve)), child: child,),
            )));
}
//无动画
class NoAnimRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  NoAnimRouter({this.child}) : super(
      opaque: false,
      pageBuilder: (context, animation, secondaryAnimation) => child,
      transitionDuration: Duration(milliseconds: 0),
      transitionsBuilder: (context, animation, secondaryAnimation, child) => child);
}